package collections;


import java.util.Arrays;

public class Container {
    private Object[] elements; //声明一个数组类型的引用变量
    //声明一个 int 类型的变量用来统计容器中的元素个数
    private int counter;
    //声明一个 float 类型的变量用来确定扩容时机
    private float loadFactor;

    public Container(){
        this( 10 ,0.75F);
    }

    public Container( int initialCapacity){
        this(initialCapacity , 0.75F);
    }

    public Container( int initialCapacity ,float loadFactor) {
        if( initialCapacity <= 0 ) {
            initialCapacity = 10 ;
        }
        this.elements = new Object[ initialCapacity ];

        if( loadFactor <= 0 || loadFactor >= 1 ) {
            loadFactor = 0.75F ;
        }
        this.loadFactor = loadFactor ;
    }


    /**
     * 确保容器的容量（ 实际上是数组容量 ）足以容纳下一个元素
     */

    private void ensureCapacity () {
        //当达到某个条件时，就对容器进行扩容
        if ( counter > elements.length * loadFactor){
            //将 原来的数组 的地址 暂存到 temp 变量中
            final Object[] temp = this.elements;
            // 创建新数组 ( 创建一个新的、更大的数组 ) 并将新数组地址赋值到 elements 变量
            this.elements = new Object[ temp.length * 3 / 2 + 1];
            // 将原数组中的[ 0 , counter ) 之间的元素拷贝到新数组中
            System.arraycopy( temp ,  0 ,  elements ,  0 , counter );
            // 后续就使用新数组 (放弃老数组) 了 ( 因为 elements 变量中存储了 新数组的地址 )
        }
    }

    //将 参数对应的 对象 添加到 容器 中
    public boolean add(Object element){

        // 确保容器内部的数组容量足以容纳新的元素
        this.ensureCapacity();

        //将 element  elements 数组的 counter 处后，再对 counter 自增
        elements[ counter++ ] = element;
        return true;
    }

    public int size(){
        return this.counter;
    }

    public boolean isEmpty(){
        return counter == 0;
    }

    /**
     * 清空容器
     */
    public void clear () {
        this.counter = 0;
        Arrays.fill( elements , null );
    }


    /**
     * 返回一个包含了容器内部有效元素组成的数组
     * @return
     */
    public Object[] toArray(){
        // 将 elements 数组中的 [ 0 , counter ) 之间的元素复制到新数组
        Object[] array = Arrays.copyOf( elements , counter);
        return array;
    }


    @Override
    public String toString(){
        StringBuilder builder = new StringBuilder();
        builder.append("~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ");
        builder.append('\n');
        builder.append("容器的当前容量是 : " + elements.length);
        builder.append('\n');
        builder.append( "容器的元素个数是: " + counter );
        builder.append( "\n" );

        if( counter > 0 ) {
            builder.append( "容器中的元素有: " );
            for( int i = 0 ; i < counter ; i++ ) {
                builder.append( elements[ i ] );
                builder.append( i < counter -1 ? " , " : "\n" );
            }
        } else {
            builder.append( "容器中尚未添加有效元素" );
            builder.append( "\n" );
        }

        builder.append("~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ");
        String s = builder.toString();
        return s;
    }

}
